#ifndef __CHIP_PIN_HPP__
#define __CHIP_PIN_HPP__

#include <iostream>
#include <string>

extern "C"
{
#include <rtthread.h>
#include <rtdevice.h>
#include <math.h>
#include <stdint.h>
}

typedef enum
{
    chip_pin_status_fail,
    chip_pin_status_ok,
} chip_pin_status;

typedef enum
{
    chip_pin_level_LOW,
    chip_pin_level_HIGH,
    chip_pin_level_ERROR
} chip_pin_level; //管脚电平

typedef enum
{
    chip_input_pin_mode_simple,
    chip_input_pin_mode_interrupt_rising_active,
    chip_input_pin_mode_interrupt_falling_active,
    chip_input_pin_mode_interrupt_rising_falling_active,
    chip_input_pin_mode_interrupt_high_active,
    chip_input_pin_mode_interrupt_low_active
} chip_input_pin_mode;

typedef enum
{
    chip_input_pin_pull_mode_up,
    chip_input_pin_pull_mode_down,
    chip_input_pin_pull_mode_none,
} chip_input_pin_pull_mode;

typedef enum
{
    chip_output_pin_out_mode_od,
    chip_output_pin_out_mode_normal
} chip_output_pin_out_mode;

class CHIP_INPUT_PIN
{
private:
    rt_base_t pin_num;
    chip_input_pin_mode pin_mode;
    chip_input_pin_pull_mode pin_pull_mode;

    chip_pin_status init_flag;
public:
    CHIP_INPUT_PIN(rt_base_t pin_num, //使用GET_PIN传入
                   chip_input_pin_mode pin_mode,
                   chip_input_pin_pull_mode pin_pull_mode,
                   void (*pin_interrupt_handler)(void *handler_args), //中断返回函数，simple模式不启用可输入NULL
                   void *handler_args); //中断返回函数的参数，simple模式不启用或不需要该值可输入NULL
    ~CHIP_INPUT_PIN();

    /*中断模式使用*/
    chip_pin_status CHIP_INPUT_PIN_irq_enable();
    chip_pin_status CHIP_INPUT_PIN_irq_disable();

    /*简单模式使用*/
    chip_pin_level CHIP_INPUT_PIN_read();

    chip_input_pin_mode CHIP_INPUT_PIN_read_pin_mode();
    chip_pin_status CHIP_INPUT_PIN_read_init_status();
};

class CHIP_OUTPUT_PIN
{
private:
    rt_base_t pin_num; //使用GET_PIN传入
    chip_output_pin_out_mode pin_out_mode;

    chip_pin_level pin_level;
    rt_mutex_t pin_level_lock;
    chip_pin_status init_flag;
public:
    CHIP_OUTPUT_PIN(rt_base_t pin_num, chip_output_pin_out_mode pin_out_mode, chip_pin_level default_level);
    ~CHIP_OUTPUT_PIN();

    //返回PIN_LOW或PIN_HIGH
    chip_pin_level CHIP_OUTPUT_PIN_read();
    void CHIP_OUTPUT_PIN_write(chip_pin_level write_level);

    chip_pin_status CHIP_OUTPUT_read_init_status();

};

#endif /*__CHIP_PIN_HPP__*/

